package com.yitiao.multithread;


import java.util.concurrent.RecursiveTask;

/**
 * f(n) = f(n-1) + f(n-2)
 * @author libiao
 */
public class FibonacciTask extends RecursiveTask<Integer> {
    private final int n;

    public FibonacciTask(int n) {
        this.n = n;
    }

    @Override
    protected Integer compute() {
        if (n <= 1) {
            return n;
        }
        FibonacciTask left = new FibonacciTask(n - 1);
        FibonacciTask right = new FibonacciTask(n - 2);
        left.fork();
        int rightResult = right.compute();
        int leftResult = left.join();
        return leftResult + rightResult;
    }

    public static void main(String[] args) {
        FibonacciTask task = new FibonacciTask(10);
        System.out.println(task.compute()); // 输出 55

//        FutureTask futureTask = new FutureTask<>();
//        CompletableFuture
    }
}

//    在这个案例中，我们定义了一个  FibonacciTask  任务，它继承了  RecursiveTask  类，重写了  compute()  方法来计算斐波那契数列。
//
//    当计算斐波那契数列的第  n  项时，我们首先判断  n  是否小于等于  1  ，如果是，直接返回  n  。
//    否则，我们分别创建两个新的  FibonacciTask  任务来计算第  n-1  项和第  n-2  项，
//    然后调用  left.fork()  方法启动  left  任务的异步执行，同时继续同步执行  right  任务。
//
//    在计算  right  任务的过程中，如果发现这个任务的计算量非常小，可以直接在当前线程中进行计算；
//
//    否则，就递归地调用  compute()  方法，将  right  任务分解成更小的子任务去执行。
//
//    当  left  任务执行完毕后，我们调用  left.join()  方法获取其计算结果，然后将其与  right  的结果相加，就得到了斐波那契数列的第  n  项。

